#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>

// void *start_routine(void *args)
// {
//     // 一个线程如果出现了异常，会影响其他线程吗？ 会的(线程的健壮性或者鲁棒性较差)
//     // 为什么会影响其他线程？？？ 进程信号。信号是整体发给进程的！！ 这里遇到了段错误（11号信号），所以OS发送11号信号
//     // 给进程，那因为所有线程的pid相等，所以给所有的线程退出了
//     while (1)
//     {
//         printf("new thread create success, name: %s\n", (char *)args);
//         sleep(1);
//         // 这里
//         int *p = NULL;
//         // p = NULL;
//         *p = 0;
//     }
// }

// int main()
// {
//     pthread_t id;
//     // 创建一个轻量级进程(新线程)
//     pthread_create(&id, NULL, start_routine, (void *)"thread new ");
//     while (1)
//     {
//         printf("new thread create success, name: main thread\n");
//         sleep(1);
//     }

//     return 0;
// }

// ---------------------------------- 创建一批线程 ------------------------------

typedef struct ThreadData
{
    pthread_t tid;
    char namebuffer[64];
} ThreadData;

// 1.这个函数被10个线程执行，这个函数现在是可重入状态
// 2. 该函数是可重入函数
// 3. 在函数内定义的变量，都叫做局部变量，具有临时性 -- 今天依旧适用 --- 在多线程情况下，也没有问题 -- 其实每一个线程都有自己独立的栈结构

void *start_routine(void *args)
{
    int cnt = 10;
    ThreadData *td = (ThreadData *)args; // 这里需要强制转行
    while (cnt)
    {
        printf("new thread create success, name: %s: %x ,cnt: %d\n", td->namebuffer, td->tid, cnt--);
        sleep(1);
    }
    return NULL;
}

int main()
{
#define NUM 10 // 需要多少个线程
    // 创建一个存放 所有线程的id
    // void *malloc(size_t size)
    ThreadData **threads = malloc(NUM * sizeof(ThreadData *)); // 存放线程的数据
    // 初始化元素 就是创建线程
    for (int i = 0; i < NUM; i++)
    {
        ThreadData *td = malloc(sizeof(ThreadData));
        snprintf(td->namebuffer, sizeof(td->namebuffer), "%s:%d", "thread", i + 1);
        // 创建新线程
        // pthread_create(&tid, NULL, start_routine, (void *)(intptr_t)i);
        pthread_create(&td->tid, NULL, start_routine, td);
        threads[i] = td;
        // *(threads + i) = td;
    }
    // 主线程
    // 打印关于线程的数据
    for (int i = 0; i < NUM; i++)
    {
        printf("--------------------------------------------------\n");
        printf("create thread: %s : %d  sucess\n", (*(threads + i))->namebuffer, (*(threads + i))->tid, i);
        printf("--------------------------------------------------\n");
    }
    while (1)
    {
        printf("new thread create success, name: main thread\n");
        sleep(1);
    }

    free(threads); // 释放 tids 数组的内存

    return 0;
}
